package com.sdry.mapper.zc;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.sdry.model.barCodeOperation.BarCodeOperation;
import com.sdry.model.jyy.TrayLocation;
import com.sdry.model.lz.CodeMark;
import com.sdry.model.lz.Materiel;
import com.sdry.model.lz.WarehouseRegionLocation;
import com.sdry.model.zc.ZcMaterielAndTrayEntity;
import com.sdry.model.zc.ZcMaterielNameAndCode;
import com.sdry.model.zc.ZcMaterileMoveInfoEntity;
/**
 * 物料托盘绑定与解绑
 * @ClassName:ZcBindAndUnbindMapper
 * @Description: 
 * 1.多仓库修改  t  2019-11-01 
 * 286-301	根据条码和仓库id查询物料托盘关联表和对应的库位
 * 310-319	根据条码+","、仓库查询库区编号
 * 2、多仓库修改  t  2019-11-04
 * 35-48	根据物料条码和仓库id查询物料信息及其批次是否良品、数量等
 * 49-62	根据物料条码（无逗号）和仓库id查询物料托盘绑定信息条数（且不在DJ、HC、SY）
 * 157-168	不良品库位推荐
 * 3、多仓库修改  t  2019-11-05 
 * 69-83	通过物料条码和仓库id查询物料所在位置
 * 169-183	通过物料条码和仓库id查询物料id和批次
 * 256-270	通过物料条码和仓库id查询物料id和批次,原托盘
 * 271-285	通过物料条码和仓库id查询物料所在位置 不包含缓冲区（HC）（下架）
 * 326-340	根据库位码和仓库id查询在良品区的条数
 * 341-355	根据库位码和仓库id查询在不良品区的条数
 * @Author tdd
 * @Date 2019年11月1日下午5:46:28
 * @version 1.0
 */
public interface ZcBindAndUnbindMapper {
	/* ******************************多仓库修改  t  2019-11-04 开始*************************** */
	/**
	 * 根据物料条码和仓库id查询物料信息及其批次是否良品、数量等
	 * @param materiel_code 物料条码（无逗号）
	 * @param warehouse_id 仓库id
	 * @return
	 */
	public Materiel selectMaterielInfoByCode(@Param("materiel_code")String materiel_code,@Param("warehouse_id")Long warehouse_id);
	/**多仓库修改之前：
	 * 通过物料精准码查询物料详情
	 * @param materiel_code
	 */
	//多仓库修改之前：public Materiel selectMaterielInfoByCode(String materiel_code);
	/* ******************************多仓库修改  t  2019-11-04 结束*************************** */
	/* ******************************多仓库修改  t  2019-11-04 开始*************************** */
	/**
	 * 根据物料条码（无逗号）和仓库id查询物料托盘绑定信息条数（且不在DJ、HC、SY）
	 * @param materiel_code 物料条码（无逗号）
	 * @param warehouse_id 仓库id
	 * @return
	 */
	public int selectBindByMaterielCode(@Param("materiel_code")String materiel_code,@Param("warehouse_id")Long warehouse_id);
	/** 多仓库修改之前：
	 * 查询这个物料条码是否已经绑定过了
	 * @param materiel_code
	 */
	//多仓库修改之前：public int selectBindByMaterielCode(String materiel_code);
	/* ******************************多仓库修改  t  2019-11-04 结束*************************** */
	/**
	 * 绑定
	 * @param zcMaterielAndTrayEntity
	 * @return
	 */
	public int bindingMaterielAndTray(ZcMaterielAndTrayEntity zcMaterielAndTrayEntity);
	/* ******************************多仓库修改  t  2019-11-05 开始*************************** */
	/**
	 * 通过物料条码和仓库id查询物料所在位置
	 * @param materiel_code    物料条码
	 * @param warehouse_id     仓库id
	 * @return
	 */
	public ZcMaterielAndTrayEntity selectMaterielLocationByCode(@Param("materiel_code")String materiel_code,@Param("warehouse_id")Long warehouse_id);
	/**
	 * 通过物料条码查询物料所在位置
	 * @param materiel_code
	 * @return
	 *//*
	public ZcMaterielAndTrayEntity selectMaterielLocationByCode(String materiel_code);*/
	/* ******************************多仓库修改  t  2019-11-05 结束*************************** */
	/**
	 * 通过物料条码查询物料所在位置查整个库位的物料
	 * @param materiel_code
	 * @return
	 */
	public List<ZcMaterielAndTrayEntity> selectMaterielLocationByCodeNew(String materiel_code);
	/**
	 * 解绑前查询原托盘物料
	 * @param zcMaterielAndTrayEntity
	 * @return
	 */
	public ZcMaterielAndTrayEntity selectMaterielCodeByTrayCode(ZcMaterielAndTrayEntity zcMaterielAndTrayEntity);
	/**
	 * 解绑
	 * @param zcMaterielAndTrayEntity
	 * @return
	 */
	public int downAndUnbind(ZcMaterielAndTrayEntity zcMaterielAndTrayEntity);
	/**
	 * 绑定前查询托盘是否为空
	 * @param tray_code
	 * @return
	 */
	public ZcMaterielAndTrayEntity selectMaterielAndTray(ZcMaterielAndTrayEntity zcMaterielAndTrayEntity);
	/**
	 * 托盘不为空是追加物料
	 * @param zcMaterielAndTrayEntity
	 * @return
	 */
	public int addMaterielAndTray(ZcMaterielAndTrayEntity zcMaterielAndTrayEntity);
	/**
	 * 通过产品码，规格型号查询物料id
	 * @param zcMaterielAndTrayEntity
	 * @return
	 */
	public Long selectMidByNewCode(ZcMaterielAndTrayEntity zcMaterielAndTrayEntity);
	/**
	 * 删除空库位空托盘
	 */
	public void deleteEmpty();
	/**
	 * 解绑托盘物料
	 * @param zcMaterielAndTrayEntity
	 */
	public void unbindMaterielAndTray(ZcMaterielAndTrayEntity zcMaterielAndTrayEntity);
	/**
	 * 推荐最优库位
	 * @param region_id
	 * @return
	 */
	public WarehouseRegionLocation selectTopOneLocation(Long region_id);
	/**
	 * 下架库位推荐（先进先出）
	 */
	public WarehouseRegionLocation selectTopLocationDown(String materiel_num);
	/**
	 * 通过物料条码查询物料名称
	 * @param materiel_code
	 * @return
	 */
	public ZcMaterielNameAndCode selectNameByCode(String materiel_code);
	/**
	 * 通过条码查数量
	 * @param string
	 * @return
	 */
	public int selectNumByCode(String string);
	/**
	 * 通过库位码查询库区是否是不良区
	 * @param location_code
	 * @return
	 */
	public int selectBadRegionByLocation(String location_code);
	/* ******************************多仓库修改  t  2019-11-04 开始*************************** */
	/**
	 * 不良品库位推荐
	 * @return
	 */
	public WarehouseRegionLocation selectTopOneLocationBad(Long warehouse_id);
	/** 多仓库修改之前：
	 * 不良品库位推荐
	 * @return
	 */
	//多仓库修改之前：public WarehouseRegionLocation selectTopOneLocationBad();
	/* ******************************多仓库修改  t  2019-11-04 结束*************************** */
	/* ******************************多仓库修改  t  2019-11-05 开始*************************** */
	/**
	 * 通过物料条码和仓库id查询物料id和批次
	 * @param materiel_code 物料条码
	 * @param warehouse_id 仓库id
	 * @return
	 */
	public ZcMaterileMoveInfoEntity selectMaterileMoveInfoByCode(@Param("materiel_code")String materiel_code,@Param("warehouse_id")Long warehouse_id);
	/** 多仓库修改之前：
	 * 通过物料条码查询物料id和批次
	 * @param materiel_code
	 * @return
	 *//*
	public ZcMaterileMoveInfoEntity selectMaterileMoveInfoByCode(String materiel_code);*/
	/* ******************************多仓库修改  t  2019-11-05 结束*************************** */
	/**
	 * 给质检区加库存
	 * @param zcMaterileMoveInfoEntity
	 * @return
	 */
	public int insertQualityWare(ZcMaterileMoveInfoEntity zcMaterileMoveInfoEntity);
	/**
	 * 从待检区出库
	 * @param zcMaterileMoveInfoEntity
	 * @return
	 */
	public int outQuality(ZcMaterileMoveInfoEntity zcMaterileMoveInfoEntity);
	/**
	 * 入良品库
	 * @param zcMaterileMoveInfoEntity
	 * @return
	 */
	public int inGood(ZcMaterileMoveInfoEntity zcMaterileMoveInfoEntity);
	/**
	 * 入不良品库
	 * @param zcMaterileMoveInfoEntity
	 * @return
	 */
	public int inBad(ZcMaterileMoveInfoEntity zcMaterileMoveInfoEntity);
	/**
	 * 从良品库出库
	 * @param zcMaterileMoveInfoEntity
	 * @return
	 */
	public int outGood(ZcMaterileMoveInfoEntity zcMaterileMoveInfoEntity);
	/**
	 * 入缓存区库存
	 * @param zcMaterileMoveInfoEntity
	 * @return
	 */
	public int inCache(ZcMaterileMoveInfoEntity zcMaterileMoveInfoEntity);
	/**
	 * 从不良品库出库
	 * @param zcMaterileMoveInfoEntity
	 * @return
	 */
	public int outBad(ZcMaterileMoveInfoEntity zcMaterileMoveInfoEntity);
	/**
	 * 从缓存区出库
	 * @param zcMaterileMoveInfoEntity
	 * @return
	 */
	public int outCache(ZcMaterileMoveInfoEntity zcMaterileMoveInfoEntity);
	/**
	 * 入损益区库存
	 * @param zcMaterileMoveInfoEntity
	 * @return
	 */
	public int inProfitAndLoss(ZcMaterileMoveInfoEntity zcMaterileMoveInfoEntity);
	/**
	 * 损益区出库
	 * @param zcMaterileMoveInfoEntity
	 * @return
	 */
	public int outProfitAndLoss(ZcMaterileMoveInfoEntity zcMaterileMoveInfoEntity);
	/**
	 * 通过条码查询托盘
	 * @param materiel_code
	 * @return
	 */
	public String selectTrayCodeByMcode(String materiel_code);
	/* ******************************多仓库修改  t  2019-11-05 开始*************************** */
	/**
	 * 根据托盘和仓库id查询对应托盘库位绑定条数
	 * @param tray_code  托盘
	 * @param warehouse_id 仓库id
	 * @return
	 */
	public int selectCountByTray(@Param("tray_code")String tray_code,@Param("warehouse_id")Long warehouse_id);
	/** //多仓库修改之前：
	 * 查询托盘是否在库位
	 * @param tray_code
	 * @return
	 *//*
	public int selectCountByTray(String tray_code);*/
	/* ******************************多仓库修改  t  2019-11-05 结束*************************** */
	/* ******************************多仓库修改  t  2019-11-05 开始*************************** */
	/**
	 * 通过物料条码和仓库id查询物料id和批次,原托盘
	 * @param materiel_code 物料条码
	 * @param warehouse_id 仓库id
	 * @return
	 */
	public ZcMaterileMoveInfoEntity selectMaterileMoveInfoByCodeSrc(@Param("materiel_code")String materiel_code,@Param("warehouse_id")Long warehouse_id);
	/** //多仓库修改之前：
	 * 通过物料条码查询物料id和批次,原托盘
	 * @param string
	 * @return
	 *//*
	public ZcMaterileMoveInfoEntity selectMaterileMoveInfoByCodeSrc(String materiel_code);*/
	/* ******************************多仓库修改  t  2019-11-05 结束*************************** */
	/* ******************************多仓库修改  t  2019-11-05 开始*************************** */
	/**
	 * 通过物料条码和仓库id查询物料所在位置 不包含缓冲区（HC）（下架）
	 * @param materiel_code 物料条码
	 * @param warehouse_id 仓库id
	 * @return
	 */
	public List<ZcMaterielAndTrayEntity> selectMaterielLocationByCodeDown(@Param("materiel_code")String materiel_code,@Param("warehouse_id")Long warehouse_id);
	/**  //多仓库修改之前：
	 * 扫码查询物料位置（下架）
	 * @param materiel_code
	 * @return
	 *//*
	public List<ZcMaterielAndTrayEntity> selectMaterielLocationByCodeDown(String materiel_code);*/
	/* ******************************多仓库修改  t  2019-11-05 结束*************************** */
	/* ******************************多仓库修改  t  2019-11-01 开始*************************** */
	/**
	 * 根据条码和仓库id查询物料托盘关联表和对应的库位
	 * @param materiel_code 物料条码
	 * @param warehouse_id 仓库id
	 * @return
	 */
	public List<ZcMaterielAndTrayEntity> selectMaterielLocationByCodeDown1(@Param("materiel_code")String materiel_code,@Param("warehouse_id")Long warehouse_id);
	//多仓库修改之前：
	/**
	 * 扫码查询物料位置（下架2）
	 * @param materiel_code
	 * @return
	 *//*
	public List<ZcMaterielAndTrayEntity> selectMaterielLocationByCodeDown1(String materiel_code);*/
	/* ******************************多仓库修改  t  2019-11-01 结束*************************** */
	/**
	 * 通过物料条码查询物料是否在对应位置
	 * @param materiel_code
	 * @param location_code 库区编号
	 * @return
	 */
	public List<ZcMaterielAndTrayEntity> selectMaterielLocationByCodeDownLocation(@Param("materiel_code")String materiel_code,@Param("location_code")String location_code);
	
	/* ******************************多仓库修改  t  2019-11-01 开始*************************** */
	/**
	 * 根据条码+","、仓库查询库区编号
	 * @param materiel_code 条码 +","
	 * @param warehouse_id 仓库id
	 * @return 库区编码
	 */
	public String selectByMaterielCode(@Param("materiel_code")String materiel_code, @Param("warehouse_id")Long warehouse_id);
	//多仓库修改之前：public String selectByMaterielCode(String materiel_code);
	/* ******************************多仓库修改  t  2019-11-01 结束*************************** */
	/**
	 * 根据精准码查询库位集合
	 * @param code
	 * @return
	 */
	public List<WarehouseRegionLocation> queryLocationByCode(String code);
	/* ******************************多仓库修改  t  2019-11-05 开始*************************** */
	/**
	 * 根据库位码和仓库id查询在良品区的条数
	 * @param location_code 库位码
	 * @param warehouse_id 仓库id
	 * @return
	 */
	public int selectCountGoodByLocationCode(@Param("location_code")String location_code,@Param("warehouse_id")Long warehouse_id);
	/** //多仓库修改之前：
	 * 查询库位码是否在良品区
	 * @param location_code
	 * @return
	 *//*
	public int selectCountGoodByLocationCode(String location_code);*/
	/* ******************************多仓库修改  t  2019-11-05 结束*************************** */
	/* ******************************多仓库修改  t  2019-11-05 开始*************************** */
	/**
	 * 根据库位码和仓库id查询在不良品区的条数
	 * @param location_code 库位码
	 * @param warehouse_id 仓库id
	 * @return
	 */
	public int selectCountBadByLocationCode(@Param("location_code")String location_code,@Param("warehouse_id")Long warehouse_id);


    List<WarehouseRegionLocation> getRegionDetailByRegionId(@Param("regionId") Long regionId,@Param("wareHouseId") Long wareHouseId);

	/**
	 * 点击库位详细信息
	 * @param location_num
	 * @param session
	 * @return
	 */
    WarehouseRegionLocation getRegionDetail(@Param("location_num") String location_num, @Param("wareHouseId") Long wareHouseId);

	List<Materiel> getMterielList(@Param("location_num") String location_num,@Param("wareHouseId") Long wareHouseId);

	/** //多仓库修改之前：
	 * 查询库位码是否在不良品区
	 * @param location_code
	 * @return
	 *//*
	public int selectCountBadByLocationCode(String location_code);*/
	/* ******************************多仓库修改  t  2019-11-05 结束*************************** */
	
	/**
	 * 根据条码查询此条码的托盘库位等信息
	 * @author jyy
	 * @param materiel_code 条码
	 * @return 托盘库位联合实体集合
	 */
	public List<TrayLocation> selectInfoByCode(String materiel_code);
	
	/**
	 * 根据物料id,仓库id,批次，是否良品4个字段查询同批剩余
	 * @param trayLocation 查询实体
	 * @return 同批剩余总数
	 */
	public int selectOtherCommon(TrayLocation trayLocation);
	
	/**
	 * 整托上架
	 * @param materiel_code 物料条码
	 * @param location_code 库位条码
	 * @param tray_code 托盘条码
	 * @param targetRegion 目标区域
	 * @param binding_person 人员id
	 * @param warehouse_id 仓库id
	 * @return 返回状态值
	 */
	public int wholeUp(@Param("tray_code")String tray_code, @Param("location_name")String location_name,
			@Param("targetLocation")String targetLocation, @Param("binding_person")Long binding_person, @Param("warehouse_id")Long warehouse_id);
	
	/**
	 * 部分上架
	 * @param materiel_code 物料条码
	 * @param location_code 库位条码
	 * @param tray_code 托盘条码
	 * @param targetRegion 目标区域
	 * @param binding_person 人员id
	 * @param warehouse_id 仓库id
	 * @return 返回状态值
	 */
	public int partUp(@Param("tray_code")String tray_code, @Param("location_name")String location_name,
			@Param("targetLocation")String targetLocation, @Param("binding_person")Long binding_person, @Param("warehouse_id")Long warehouse_id);
	
	/**
	 * 根据条码查询该条码的数量
	 * @param s
	 * @return 数量
	 */
	public Integer queryCodeMarkByCode(String code);
	
	/**
	 * 根据托盘，修改物料托盘绑定表中对应的信息
	 * @param zcMaterielAndTrayEntity 物料托盘绑定实体
	 */
	public void updateMaterielAndTray(ZcMaterielAndTrayEntity zcMaterielAndTrayEntity);
	
	/**
	 * 查询托盘码在不在目标库位上
	 * @param tray_code 托盘
	 * @return
	 */
	public List<String> selectTrayExist(@Param("tray_code")String tray_code);
	
	/**
	 * 查询条码是否在目标库位上
	 * @param code 条码
	 * @param targetLocation 目标库位
	 * @return 统计结果
	 */
	public int selectCodeExist(@Param("code")String code, @Param("targetLocation")String targetLocation);
	
	/**
	 * 整个库位下架
	 * @author jyy
	 * @param location_code 库位码
	 * @param warehouse_id 仓库
	 * @param binding_person 操作人
	 */
	public int wholeDown(@Param("location_code")String location_code, @Param("warehouse_id")Long warehouse_id, @Param("binding_person")Long binding_person);
	
	/**
	 * 根据库位查询该库位的所有条码及信息
	 * @param location_code 库位
	 * @param warehouse_id 仓库id
	 * @return 条码信息
	 */
	public List<BarCodeOperation> selectAllCodeByLocation(@Param("location_code")String location_code, @Param("warehouse_id")Long warehouse_id);
	
	/**
	 * 部分下架
	 * @param trayLocation
	 * @return 影响行数
	 */
	public int partDown(TrayLocation trayLocation);
	
	/**
	 * 查询系统中所有的仓库，库位
	 * @return 集合
	 */
	public List<TrayLocation> selectAllLocation();
	
	/**
	 * 根据库位和仓库id，删除所有没用的托盘，和空托盘，空库位
	 * @param trayLocation 实体
	 */
	public void deleteTrayAndLocation(TrayLocation trayLocation);
	
	/**
	 * 根据物料SAP查询物料所在位置及数量
	 * @param number 物料SAP
	 * @param warehouse_id 仓库id
	 * @return 集合
	 */
	public List<TrayLocation> selectLocationAndNum(@Param("number")String number, @Param("warehouse_id")Long warehouse_id);
	
	/**
	 * 根据物料id 和  库位码 查询条码信息
	 * @param mid 物料id
	 * @param location_code 库位
	 * @param warehouse_id 仓库id
	 * @return 条码信息集合
	 */
	public List<CodeMark> selectCodeInfoByLocationAndMa(@Param("mid")Long mid, @Param("location_code")String location_code, @Param("warehouse_id")Long warehouse_id);
	
}
